// 实现一个First<T>泛型，它接受一个数组T并返回它的第一个元素的类型。
type arr1 = ["a", "b", "c"];
type arr2 = [3, 2, 1];

// type First<T extends any[]> = T extends [] ? never : T[0]
// type First<T extends any[]> = T["length"] extends 0 ? never : T[0];
// infer A 是一个类型变量，用于捕获元组的第一个元素类型。...infer rest 是剩余元素的解构
type First<T extends any[]> = T extends [infer A, ...infer rest] ? A : never;

type head1 = First<arr1>; // 应推导出 'a'
type head2 = First<arr2>; // 应推导出 3

// 构造了一个新的元组，使得原元组的最后一个元素现在变成了新元组的倒数第二个元素。
type Last<T extends any[]> = [any, ...T][T["length"]];
// type Last<T extends any[]> = T extends [...infer rest, infer Last]
//   ? Last
//   : never;
type arr11 = ["a", "b", "c"];
type arr22 = [3, 2, 1];

type tail1 = Last<arr11>; // 应推导出 'c'
type tail2 = Last<arr22>; // 应推导出 1
